//=============================================================================
/**
 * @file	opd_scene4.c
 * @brief	オープニングデモシーン4	主人公・ポケ
 * @author	Nozomu Saito
 * @date    2009.03.20
 */
//=============================================================================

#include "opening_demo_local.h"
#include "opd_scene4.h"

#include "system/wipe.h"
#include "system/arc_tool.h"
#include "system/clact_tool.h"		//for REND_OAMTrans
#include "op_demo.naix"

#include "opd_def.h"

#include "particledata/particledata.h"	//for particle
#include "particledata/particledata.naix"	//for particle

#define DISP_DISTANCE	(256)

#define	ACT_ID_S4_HAND	(0)
#define	ACT_ID_S4_MONS1	(1)
#define	ACT_ID_S4_MONS2	(2)
#define	ACT_ID_S4_MONS3	(3)

#define S4_HAND_PALETTE_NUM	(2)
#define S4_POKE_PALETTE_NUM	(1)

#define HERO_HAND_DEF_POS_X	(128)
#define HERO_HAND_DEF_POS_Y	(96+DISP_DISTANCE)
#define HEROINE_HAND_DEF_POS_X	(128)
#define HEROINE_HAND_DEF_POS_Y	(96)
#define POKE_DEF_POS_X	(128)
#define POKE_DEF_POS_Y	(96)
#define FLASH_DEF_POS_X	(128)
#define FLASH_DEF_POS_Y	(96)

#define	HERO_BG_OFS	(-192)
#define	HEROINE_BG_OFS	(192)
#define	HERO_BG_SLIDE_VAL	(192)
#define	HEROINE_BG_SLIDE_VAL	(-192)

//グラフィックデータ依存
#define ANM_NO_HERO_HAND		(0)
#define ANM_NO_HEROINE_HAND		(1)
#define ANM_NO_FLASH		(2)
#define ANM_NO_MONS		(0)

///戦闘パーティクルのカメラニア設定
#define BP_NEAR			(FX32_ONE)
///戦闘パーティクルのカメラファー設定
#define BP_FAR			(FX32_ONE * 900)

#define ONE_DOT	(172)	//約1ドット

//シーン4		主人公・ポケ
#define MAIN_HEROINE_FRAME		(GF_BGL_FRAME1_M)
#define MAIN_SILVER_FRAME		(GF_BGL_FRAME2_M)
#define MAIN_GOLD_FRAME			(GF_BGL_FRAME3_M)

#define SUB_HERO_FRAME		(GF_BGL_FRAME1_S)
#define SUB_SILVER_FRAME	(GF_BGL_FRAME2_S)
#define SUB_GOLD_FRAME		(GF_BGL_FRAME3_S)


//シーケンス
enum{
	SEQ_WIPE_IN,
	SEQ_WIPE_IN_WAIT,
	SEQ_HERO_SCROLL_IN,
	SEQ_HERO_SCROLL_IN_WAIT,
	SEQ_HERO_HEROINE_DISP,
	SEQ_HERO_SCROLL_OUT,
	SEQ_HERO_SCROLL_OUT_WAIT,
	SEQ_CHIKO_SLIDE_IN,
	SEQ_CHIKO_PARTICLE,
	SEQ_CHIKO_SLIDE_OUT_WAIT,
	SEQ_DISP_SWITCH_UPMAIN,
	SEQ_HINO_SLIDE_IN,
	SEQ_HINO_PARTICLE,
	SEQ_HINO_SLIDE_OUT_WAIT,
	SEQ_DISP_SWITCH_DOWNMAIN,
	SEQ_WANI_SLIDE_IN,
	SEQ_WANI_PARTICLE,
	SEQ_WANI_SLIDE_OUT_WAIT,
	SEQ_WIPE_OUT_WAIT,
	SEQ_FLASH_START,
	SEQ_FLASH_WAIT,
};


static void VBlanikFunc(void* work);

static void Scene4BgSet(OPD_WK_PTR wk);
static void Scene4GraLoad(GF_BGL_INI *bgl, SCENE4_WORK *scene);
static void Scene4_Init(OPD_WK_PTR wk, SCENE4_WORK *scene);
static void SetScene4Start(OPD_WK_PTR wk, GF_BGL_INI *bgl);
static BOOL Scene4_Main(OPD_WK_PTR wk, SCENE4_WORK *scene, const int inCounter);
static void Scene4_End(OPD_WK_PTR wk, SCENE4_WORK *scene);

static void InitAct(OPD_WK_PTR wk, SCENE4_WORK *scene);
static void EndAct(OPD_WK_PTR wk, SCENE4_WORK *scene);
static void SetActor( OPD_WK_PTR wk, SCENE4_WORK *scene );

static u32 sAllocTex(u32 size, BOOL is4x4comp);
static u32 sAllocTexPalette(u32 size, BOOL is4pltt);
static void ParticleCallBack(EMIT_PTR emit);
static void ParticleMain(void);
static void StartParticle(SCENE4_WORK *scene, const int inNo);
static void SetUp3D(void);

static void SwitchDisp(SCENE4_WORK *scene, const BOOL inMainDown);
static void SwitchTcb(TCB_PTR tcb, void* work);

static const int SkillEffect[S4_MONS_NUM][3] =
{
	{TITLE_PART_OP_DEMOBG2_LEAF1, TITLE_PART_OP_DEMOBG2_LEAF2, TITLE_PART_OP_DEMOBG2_LEAF3},
	{TITLE_PART_OP_DEMOBG2_FIRE1, TITLE_PART_OP_DEMOBG2_FIRE2, TITLE_PART_OP_DEMOBG2_FIRE3},
	{TITLE_PART_OP_DEMOBG2_BUBBLE1, TITLE_PART_OP_DEMOBG2_BUBBLE2, TITLE_PART_OP_DEMOBG2_BUBBLE3}
};

//リソースマネージャー登録数テーブル
static const u8 ResEntryNumTbl[RESOURCE_NUM] = {
	4,			//キャラリソース
	4,			//パレットリソース
	4,			//セルリソース
	4,			//セルアニメリソース
};

//--------------------------------------------------------------------------------------------
/**
 * シーンメイン関数
 *
 * @param	wk			ワーク
 * @param	sc_wk		シーンワークポインタ
 *
 * @return	BOOL		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
BOOL OPD_Scene4(OPD_WK_PTR wk, void *sc_wk)
{
	SCENE4_WORK *scene = (SCENE4_WORK *)sc_wk;
	u8 *seq = &(scene->Seq);

	if (OPD_GetSkipFlg(wk)){
		(*seq) = 2;		//スキップ実行
	}

	switch(*seq){
	case 0:		//初期化・グラフィックロード
		Scene4_Init(wk, scene);
		(*seq)++;
		break;
	case 1:			//メイン
		if ( Scene4_Main( wk, scene, OPD_GetFrmCounter(wk) ) ){
			(*seq)++;
		}
		break;
	case 2:			//終了
		Scene4_End(wk, scene);

		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＢＬＡＮＫ関数
 *
 * @param	work			ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VBlankFunc(void* work)
{

	OPD_WK_PTR wk = work;
	GF_BGL_VBlankFunc( OPD_GetBGL(wk) );

	// レンダラ共有OAMマネージャVram転送
	REND_OAMTrans();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン初期化
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene4_Init(OPD_WK_PTR wk, SCENE4_WORK *scene)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	// 読み込み開始位置を初期化
	CharLoadStartAll();
	PlttLoadStartAll();

	//３Ｄ描画スイッチ(下画面がメイン)
	sys.disp3DSW = DISP_3D_TO_SUB;
	GF_Disp_DispSelect();

///	SetVramBank();		//Vバンクセット

	//マスター輝度を下げる
	WIPE_SetBrightness( WIPE_DISP_MAIN,WIPE_FADE_BLACK );
	WIPE_SetBrightness( WIPE_DISP_SUB,WIPE_FADE_BLACK );

	Scene4BgSet(wk);
	OPD_ResetDispEff(wk);

	sys_VBlankFuncChange(VBlankFunc,(void*)wk);

	//グラフィックロード
	Scene4GraLoad(bgl, scene);

	//上下画面の距離をセット
	OPD_SetDispDistance( wk, 0, 0, 0, DISP_DISTANCE );

	//アクター
	InitAct(wk, scene);
	SetActor( wk, scene );

	scene->g3Dman = GF_G3DMAN_Init(HEAPID_OP_DEMO,
			GF_G3DMAN_LNK, GF_G3DTEX_128K, GF_G3DMAN_LNK, GF_G3DPLT_64K, SetUp3D );


	//パーティクル
	{
		GF_CAMERA_PTR camera_ptr;
		void *resource;
		Particle_SystemWorkInit();	//パーティクルシステム初期化
		//パーティクルメモリ確保
		scene->PtcHeap = sys_AllocMemory(HEAPID_OP_DEMO, PARTICLE_LIB_HEAP_SIZE);
		scene->PtcPtr = Particle_SystemCreate(sAllocTex, sAllocTexPalette,
											  scene->PtcHeap,
											  PARTICLE_LIB_HEAP_SIZE, TRUE, HEAPID_OP_DEMO);
		camera_ptr = Particle_GetCameraPtr(scene->PtcPtr);
		GFC_SetCameraClip(BP_NEAR, BP_FAR, camera_ptr);
		resource = Particle_ArcResourceLoad(
			ARC_PARTICLE_DATA, NARC_particledata_title_part_spa, HEAPID_OP_DEMO);
		Particle_ResourceSet(scene->PtcPtr, resource, PTC_AUTOTEX_LNK | PTC_AUTOPLTT_LNK, TRUE);
	}

	SetScene4Start(wk, bgl);

	//アルファブレンド
	G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE,
				GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1
				| GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BD, 0,0);

	scene->InitOK = 1;	//init通過
}

//--------------------------------------------------------------------------------------------
/**
 * シーン再生メイン
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 * @param	inCounter	カウンタ
 *
 * @return	BOOL 		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
static BOOL Scene4_Main(OPD_WK_PTR wk, SCENE4_WORK *scene, const int inCounter)
{
	u8 count;
	GF_BGL_INI *bgl = OPD_GetBGL(wk);
	DISP_EFF_WORK *dew;
	dew = GetDispEffWorkAdr(wk);
	count = OPD_GetSceneCount(wk);

	switch( OPD_GetSceneSeq(wk) ){
	case SEQ_WIPE_IN:			//上下画面ウィンドウマスク
		//ワイプインスタート
		WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_SPLITIN_VCENTER,
							WIPE_TYPE_SPLITIN_VCENTER,WIPE_FADE_BLACK,S4_WIPE_IN_SYNC,1,HEAPID_OP_DEMO );
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_WIPE_IN_WAIT:			//ワイプイン待ち
		if ( WIPE_SYS_EndCheck() ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_HERO_SCROLL_IN:
		//ウィンドウ設定
		{
			WND_PARAM param = {
				255,0,255,192,
				0,0,255,192,
				GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S4_HERO_SLIDE_IN_SYNC, FALSE, &param);
		}
		{
			WND_PARAM param = {
				0,0,0,192,
				0,0,255,192,
				GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S4_HEROINE_SLIDE_IN_SYNC, TRUE, &param);
		}
		//主人公スクロールイン開始
		OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_HERO_FRAME,
						HERO_BG_SLIDE_VAL, 0, S4_HERO_SLIDE_IN_SYNC );
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_HEROINE_FRAME,
						HEROINE_BG_SLIDE_VAL, 0, S4_HEROINE_SLIDE_IN_SYNC );

		//主人公手ＯＢＪ表示
		OPD_StartDispAct(scene->HeroHand, 1);
		OPD_StartDispAct(scene->HeroineHand, 1);
		//主人公ＢＧ表示
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_HERO_SCROLL_IN_WAIT:	//スクロールイン待ち
		if (OPD_CheckScrollEnd(&dew->ScrlMng, SUB_HERO_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_HEROINE_FRAME)){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_HERO_HEROINE_DISP:
		//表示ウェイト
		if (count > S4_WAIT_HERO_HEROINE){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_HERO_SCROLL_OUT:	//スクロールアウト開始
		//ウィンドウ設定
		{
			WND_PARAM param = {
				0,0,255,192,
				0,0,0,192,
				GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S4_HERO_SLIDE_OUT_SYNC, FALSE, &param);
		}
		{
			WND_PARAM param = {
				0,0,255,192,
				255,0,255,192,
				GX_WND_PLANEMASK_BG1|GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|GX_WND_PLANEMASK_OBJ,
				1,1
			};
			OPD_ReqWindowMove(&dew->WndCnt, S4_HEROINE_SLIDE_OUT_SYNC, TRUE, &param);
		}
		OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_HERO_FRAME,
						HERO_BG_SLIDE_VAL, 0, S4_HERO_SLIDE_OUT_SYNC );
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_HEROINE_FRAME,
						HEROINE_BG_SLIDE_VAL, 0, S4_HEROINE_SLIDE_OUT_SYNC );
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_HERO_SCROLL_OUT_WAIT:	//スクロールアウト待ち
		if (OPD_CheckScrollEnd(&dew->ScrlMng, SUB_HERO_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_HEROINE_FRAME)){
			//主人公手ＯＢＪ非表示
			OPD_StartDispAct(scene->HeroHand, 0);
			OPD_StartDispAct(scene->HeroineHand, 0);
			//主人公ＢＧ非表示
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
			GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );

			//ウィンドウマスクオフ
			GX_SetVisibleWnd(GX_WNDMASK_NONE);
			GXS_SetVisibleWnd(GX_WNDMASK_NONE);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_CHIKO_SLIDE_IN:		//ポケのパフォーマンス
		if (count >= S4_CONT_CHIKO_DISP_START){
			OPD_StartDispAct(scene->Mons[0], 1);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_CHIKO_PARTICLE:
		if (count >= S4_CONT_CHIKO_PTCL_START){
			StartParticle(scene, 0);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_CHIKO_SLIDE_OUT_WAIT:
		if ( (Particle_GetEmitterNum(scene->PtcPtr) == 0)&&
				( /*!CLACT_AnmActiveCheck( scene->Mons[0] )*/1 ) ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_DISP_SWITCH_UPMAIN:
		//Vタスクで上下画面スイッチ
		SwitchDisp(scene, FALSE);
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_HINO_SLIDE_IN:
		if (count >= S4_CONT_HINO_DISP_START){
			OPD_StartDispAct(scene->Mons[1], 1);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_HINO_PARTICLE:
		if (count >= S4_CONT_HINO_PTCL_START){
			StartParticle(scene, 1);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_HINO_SLIDE_OUT_WAIT:
		if ( (Particle_GetEmitterNum(scene->PtcPtr) == 0)&&
				( /*!CLACT_AnmActiveCheck( scene->Mons[1] )*/1 ) ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_DISP_SWITCH_DOWNMAIN:
		//Vタスクで上下画面スイッチ
		SwitchDisp(scene, TRUE);
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_WANI_SLIDE_IN:
		if (count >= S4_CONT_WANI_DISP_START){
			OPD_StartDispAct(scene->Mons[2], 1);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_WANI_PARTICLE:
		if (count >= S4_CONT_WANI_PTCL_START){
			StartParticle(scene, 2);
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_WANI_SLIDE_OUT_WAIT:
		//ワイプスタート
		if( (Particle_GetEmitterNum(scene->PtcPtr) == 0)&&
				( /*!CLACT_AnmActiveCheck( scene->Mons[2] )*/1 ) ){
			//ワイプアウトスタート
			WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_SPLITOUT_VSIDE,
								WIPE_TYPE_SPLITOUT_VSIDE,WIPE_FADE_BLACK,S4_WIPE_OUT_SYNC,1,HEAPID_OP_DEMO );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_WIPE_OUT_WAIT:		//ワイプ待ち
		if ( WIPE_SYS_EndCheck() ){
			u8 i;
			//メイン全ＢＧをＯＦＦ(ＯＢＪだけオン)
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_OFF );
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_OFF );
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
			//ポケ消す
			for(i=0;i<S4_MONS_NUM;i++){
				OPD_StartDispAct(scene->Mons[i], 0);
			}
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case SEQ_FLASH_START:
		//輝度元に戻す
		WIPE_ResetBrightness( WIPE_DISP_MAIN );
		//アクター表示
		OPD_StartDispAct(scene->Flash, 1);
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case SEQ_FLASH_WAIT:	//アクターアニメ終了待ち
		if ( !CLACT_AnmActiveCheck( scene->Flash ) ){
			return TRUE;
		}
		break;
	}

	ParticleMain();

	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * シーン終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene4_End(OPD_WK_PTR wk, SCENE4_WORK *scene)
{
	u8 i;
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);
	sys_VBlankFuncChange( NULL, NULL );	// VBlankセット

	if (scene->InitOK){
		//ブレンド初期化
		G2_BlendNone();
		//パーティクル解放
		Particle_SystemExit(scene->PtcPtr);
		sys_FreeMemoryEz(scene->PtcHeap);
		GF_G3D_Exit( scene->g3Dman );
		//アクター解放
		EndAct(wk, scene);
		//ＢＧＬ解放
		GF_BGL_BGControlExit( bgl, MAIN_HEROINE_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_SILVER_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_GOLD_FRAME );
		GF_BGL_BGControlExit( bgl, SUB_HERO_FRAME );
		GF_BGL_BGControlExit( bgl, SUB_SILVER_FRAME );
		GF_BGL_BGControlExit( bgl, SUB_GOLD_FRAME );
		scene->InitOK = 0;
	}

	//TCB終了
	if (scene->SwitchTcb != NULL){
		TCB_Delete(scene->SwitchTcb);
		scene->SwitchTcb = NULL;
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGセット
 *
 * @param	wk		OBJワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene4BgSet(OPD_WK_PTR wk)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	{	// BGシステム設定
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_3D
		};
		GF_BGL_InitBG( &BGsys_data );
	}

	//--メイン--		下画面
	{	// ヒロイン ＢＧ設定(メイン1)
		GF_BGL_BGCNT_HEADER MBG1_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, MAIN_HEROINE_FRAME, &MBG1_Data, GF_BGL_MODE_TEXT );
	}
	{	// シルバーグラデ ＢＧ設定(メイン2)
		GF_BGL_BGCNT_HEADER MBG2_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ2
		};
		GF_BGL_BGControlSet( bgl, MAIN_SILVER_FRAME, &MBG2_Data, GF_BGL_MODE_TEXT );
	}
	{	// ゴールドグラデ ＢＧ設定(メイン3)
		GF_BGL_BGCNT_HEADER MBG3_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x1000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 3, 0, 0, FALSE			//プライオリティ3
		};
		GF_BGL_BGControlSet( bgl, MAIN_GOLD_FRAME, &MBG3_Data, GF_BGL_MODE_TEXT );
	}

	//--サブ--		上画面
	{	// ヒーロー ＢＧ設定(サブ1)
		GF_BGL_BGCNT_HEADER SBG1_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, SUB_HERO_FRAME, &SBG1_Data, GF_BGL_MODE_TEXT );
	}
	{	// シルバーグラデ ＢＧ設定(サブ2)
		GF_BGL_BGCNT_HEADER SBG2_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ2
		};
		GF_BGL_BGControlSet( bgl, SUB_SILVER_FRAME, &SBG2_Data, GF_BGL_MODE_TEXT );
	}
	{	// ゴールドグラデ ＢＧ設定(サブ3)
		GF_BGL_BGCNT_HEADER SBG3_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x1000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 3, 0, 0, FALSE			//プライオリティ3
		};
		GF_BGL_BGControlSet( bgl, SUB_GOLD_FRAME, &SBG3_Data, GF_BGL_MODE_TEXT );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGロード
 *
 * @param	bgl		BGL
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene4GraLoad(GF_BGL_INI *bgl, SCENE4_WORK *scene)
{
	//キャラ
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_u_lz_ccgr,
						bgl, MAIN_HEROINE_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_u_lz_ccgr,
						bgl, SUB_HERO_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	//スクリーン
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_heroin_lz_cscr,
						bgl, MAIN_HEROINE_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_sil_lz_cscr,
						bgl, MAIN_SILVER_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_gol_lz_cscr,
						bgl, MAIN_GOLD_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);

	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_hero_lz_cscr,
						bgl, SUB_HERO_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_sil_lz_cscr,
						bgl, SUB_SILVER_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_grada_gol_lz_cscr,
						bgl, SUB_GOLD_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);

	//パレット
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_grada_nclr,
						PALTYPE_MAIN_BG, 0, PAL_ONE_SIZE*16*4, HEAPID_OP_DEMO );	//メイン　0番に16色4本ロード
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_grada_nclr,
						PALTYPE_SUB_BG, 0, PAL_ONE_SIZE*16*4, HEAPID_OP_DEMO );		//サブ　0番に16色4本ロード

	//--初期ＢＧ設定
	//BG0・上下画面ゲーフリロゴ非表示
///	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
///	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ベース背景とコピーライトをブレンド
///	G2_SetBlendAlpha( BLD_MASK_COPY_LIGHT, BLD_MASK_BACK_BASE_M, 0, 16);

	OS_WaitIrq(TRUE, OS_IE_V_BLANK); 	// Ｖブランク待ち
	//マスター輝度を戻す
///	WIPE_ResetBrightness( WIPE_DISP_MAIN );
///	WIPE_ResetBrightness( WIPE_DISP_SUB );

	GF_Disp_DispOn();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン開始前セットアップ
 *
 * @param	wk		ワーク
 * @param	bgl		BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetScene4Start(OPD_WK_PTR wk, GF_BGL_INI *bgl)
{
	DISP_EFF_WORK *dew;
	dew = GetDispEffWorkAdr(wk);
	//アクター初期状態セット
	{
	}
	//ＢＧ初期状態セット
	{
		//ヒーローヒロインＢＧオフセット
		OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_HERO_FRAME,
						HERO_BG_OFS, 0, 0 );
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_HEROINE_FRAME,
						HEROINE_BG_OFS, 0, 0 );

		//メインのシルバー面をオフ
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );

		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );

		//メインの3D面をオン
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_ON );
	}
/**
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_M, 0x0000 );	//背景色初期化（メイン画面）
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_S, 0x0000 );	//背景色初期化（サブ画面）
*/
}

/////////////////////////////////////
//セルアクター
//--------------------------------------------------------------------------------------------
/**
 * セルアクター初期化
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void InitAct(OPD_WK_PTR wk, SCENE4_WORK *scene)
{
	u8 i;

	const int mons_clr[S4_MONS_NUM] = {
		NARC_op_demo_demo_obj_chiko_nclr,
		NARC_op_demo_demo_obj_hino_nclr,
		NARC_op_demo_demo_obj_wani_nclr,
	};

	const int mons_cgr[S4_MONS_NUM]={
		NARC_op_demo_demo_obj_chiko_lz_ccgr,
		NARC_op_demo_demo_obj_hino_lz_ccgr,
		NARC_op_demo_demo_obj_wani_lz_ccgr,
	};

	const int mons_anr[S4_MONS_NUM] = {
		NARC_op_demo_demo_obj_chiko_lz_canr,
		NARC_op_demo_demo_obj_hino_lz_canr,
		NARC_op_demo_demo_obj_wani_lz_canr,

	};

	const int mons_cer[S4_MONS_NUM] = {
		NARC_op_demo_demo_obj_chiko_lz_ccer,
		NARC_op_demo_demo_obj_hino_lz_ccer,
		NARC_op_demo_demo_obj_wani_lz_ccer,
	};

	const int mons_act_id[S4_MONS_NUM] = {
		ACT_ID_S4_MONS1,ACT_ID_S4_MONS2,ACT_ID_S4_MONS3
	};

	const int heapid = HEAPID_OP_DEMO;
	CLACT_U_RES_MANAGER_PTR *res_man;
	//リソースマネージャー初期化
	OPD_InitResMan(wk, ResEntryNumTbl);

	res_man = OPD_GetResManPtr(wk);

	//--主人公手--
	//--chara読み込み
	scene->ResObjTbl[0][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_grada_lz_ccgr,
										TRUE, ACT_ID_S4_HAND, NNS_G2D_VRAM_TYPE_MAX, heapid);
	//--pal読み込み
	scene->ResObjTbl[0][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_grada_hand_nclr,
										FALSE, ACT_ID_S4_HAND, NNS_G2D_VRAM_TYPE_MAX,
										S4_HAND_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[0][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_grada_lz_ccer,
										TRUE, ACT_ID_S4_HAND, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[0][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_grada_lz_canr,
										TRUE, ACT_ID_S4_HAND, CLACT_U_CELLANM_RES, heapid);

	//--ポケモン
	for(i=0;i<S4_MONS_NUM;i++){
		//--chara読み込み
		scene->ResObjTbl[i+1][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
				 							res_man[CLACT_U_CHAR_RES],
											ARC_OP_DEMO, mons_cgr[i],
											TRUE, mons_act_id[i], NNS_G2D_VRAM_TYPE_2DMAIN, heapid);
		//--pal読み込み
		scene->ResObjTbl[i+1][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
											res_man[CLACT_U_PLTT_RES],
											ARC_OP_DEMO, mons_clr[i],
											FALSE, mons_act_id[i], NNS_G2D_VRAM_TYPE_2DMAIN,
											S4_POKE_PALETTE_NUM, heapid);
		//--cell読み込み
		scene->ResObjTbl[i+1][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
											res_man[CLACT_U_CELL_RES],
											ARC_OP_DEMO, mons_cer[i],
											TRUE, mons_act_id[i], CLACT_U_CELL_RES, heapid);
		//--同じ関数でanim読み込み
		scene->ResObjTbl[i+1][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
											res_man[CLACT_U_CELLANM_RES],
											ARC_OP_DEMO, mons_anr[i],
											TRUE, mons_act_id[i], CLACT_U_CELLANM_RES, heapid);
	}

	// リソースマネージャーから転送
	for (i=0;i<S4_MONS_NUM+1;i++){
		// Chara転送
		CLACT_U_CharManagerSet( scene->ResObjTbl[i][CLACT_U_CHAR_RES] );
		// パレット転送
		CLACT_U_PlttManagerSet( scene->ResObjTbl[i][CLACT_U_PLTT_RES] );
	}

	GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// MAIN DISP OBJ ON
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// SUB DISP OBJ ON
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクター終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void EndAct(OPD_WK_PTR wk, SCENE4_WORK *scene)
{
	u8 i;
	//アクター削除
	CLACT_Delete(scene->HeroHand);
	CLACT_Delete(scene->HeroineHand);
	CLACT_Delete(scene->Flash);
	for (i=0;i<3;i++){
		CLACT_Delete(scene->Mons[i]);
	}
	for (i=0;i<S4_MONS_NUM+1;i++){
		// キャラ転送マネージャー破棄
		CLACT_U_CharManagerDelete(scene->ResObjTbl[i][CLACT_U_CHAR_RES]);
		// パレット転送マネージャー破棄
		CLACT_U_PlttManagerDelete(scene->ResObjTbl[i][CLACT_U_PLTT_RES]);
	}
	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	OPD_DelResMan(wk);
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクターをセット
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void SetActor( OPD_WK_PTR wk, SCENE4_WORK *scene )
{
	u8 i;
	CLACT_HEADER			cl_act_header;
	CLACT_ADD add;

	const int mons_act_id[S4_MONS_NUM] = {
		ACT_ID_S4_MONS1,ACT_ID_S4_MONS2,ACT_ID_S4_MONS3
	};

	//ヒーロー手
	OPD_MakeClActHeader( ACT_ID_S4_HAND, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
	add.mat.x = FX32_ONE * HERO_HAND_DEF_POS_X;
	add.mat.y = FX32_ONE * HERO_HAND_DEF_POS_Y;
	scene->HeroHand = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->HeroHand,0);
	CLACT_SetDrawFlag(scene->HeroHand, 0);	//非表示
	CLACT_AnmChg( scene->HeroHand, ANM_NO_HERO_HAND );

	//ヒロイン手
	OPD_MakeClActHeader( ACT_ID_S4_HAND, wk, 0, NNS_G2D_VRAM_TYPE_2DMAIN, &add, &cl_act_header );
	add.mat.x = FX32_ONE * HEROINE_HAND_DEF_POS_X;
	add.mat.y = FX32_ONE * HEROINE_HAND_DEF_POS_Y;
	scene->HeroineHand = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->HeroineHand,0);
	CLACT_SetDrawFlag(scene->HeroineHand, 0);	//非表示
	CLACT_AnmChg( scene->HeroineHand, ANM_NO_HEROINE_HAND );

	//フラッシュ
	OPD_MakeClActHeader( ACT_ID_S4_HAND, wk, 0, NNS_G2D_VRAM_TYPE_2DMAIN, &add, &cl_act_header );
	add.mat.x = FX32_ONE * FLASH_DEF_POS_X;
	add.mat.y = FX32_ONE * FLASH_DEF_POS_Y;
	scene->Flash = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Flash,0);
	CLACT_SetDrawFlag(scene->Flash, 0);	//非表示
	CLACT_AnmChg( scene->Flash, ANM_NO_FLASH );

	//モンスター
	for (i=0;i<3;i++){
		OPD_MakeClActHeader( mons_act_id[i], wk, 0, NNS_G2D_VRAM_TYPE_2DMAIN, &add, &cl_act_header );
		add.mat.x = FX32_ONE * POKE_DEF_POS_X;
		add.mat.y = FX32_ONE * POKE_DEF_POS_Y;
		scene->Mons[i] = CLACT_Add(&add);
		CLACT_SetAnmFlag(scene->Mons[i],0);
		CLACT_SetDrawFlag(scene->Mons[i], 0);	//非表示
		CLACT_AnmChg( scene->Mons[i], ANM_NO_MONS );
	}
}

//--------------------------------------------------------------
/**
 * @brief   テクスチャVRAMアドレスを返すためのコールバック関数
 *
 * @param   size		テクスチャサイズ
 * @param   is4x4comp	4x4圧縮テクスチャであるかどうかのフラグ(TRUE=圧縮テクスチャ)
 *
 * @retval  読み込みを開始するVRAMのアドレス
 */
//--------------------------------------------------------------
static u32 sAllocTex(u32 size, BOOL is4x4comp)
{
	u32 address;
	NNSGfdTexKey key;

	key = NNS_GfdAllocTexVram(size, is4x4comp, 0);

	Particle_LnkTexKeySet(key);		//リンクドリストを使用しているのでキー情報をセット

	GF_ASSERT(key != NNS_GFD_ALLOC_ERROR_TEXKEY);

	address = NNS_GfdGetTexKeyAddr(key);
	OS_TPrintf("op_vram=%d\n", address);
	return address;
}

//--------------------------------------------------------------
/**
 * @brief	テクスチャパレットVRAMアドレスを返すためのコールバック関数
 *
 * @param	size		テクスチャサイズ
 * @param	is4pltt		4色パレットであるかどうかのフラグ
 *
 * @retval	読み込みを開始するVRAMのアドレス
 *
 * direct形式のテクスチャの場合、SPL_LoadTexPlttByCallbackFunctionは
 * コールバック関数を呼び出しません。
 */
//--------------------------------------------------------------
static u32 sAllocTexPalette(u32 size, BOOL is4pltt)
{
	NNSGfdPlttKey key;
	u32 address;

	key = NNS_GfdAllocPlttVram(size, is4pltt, NNS_GFD_ALLOC_FROM_LOW);

	if(key == NNS_GFD_ALLOC_ERROR_PLTTKEY){
		GF_ASSERT(0 && "パーティクルでパレットの確保が出来ません！\n");
	}

	Particle_PlttLnkTexKeySet(key);	//リンクドリストを使用しているのでキー情報をセット

	address = NNS_GfdGetPlttKeyAddr(key);
	OS_TPrintf("op_vram=%d\n", address);
	return address;
}

//--------------------------------------------------------------
/**
 * @brief	コールバック
 *
 * @param	emit
 *
 * @retval	none
 *
 */
//--------------------------------------------------------------
static void ParticleCallBack(EMIT_PTR emit)
{
///	SOFT_SPRITE *ss = Particle_GetTempPtr();
	VecFx32 pos = { 0, 0, 0 };
/**
	pos.x = ONE_DOT * ( SoftSpriteParaGet(ss, SS_PARA_POS_X)-128 );
	pos.y = ONE_DOT * ( SoftSpriteParaGet(ss, SS_PARA_POS_Y)-96 );
	pos.z = 0x40;
*/
	pos.x = ONE_DOT * (128-128);
	pos.y = ONE_DOT * (96-96);
	pos.z = 0x40;
	SPL_SetEmitterPosition(emit, &pos);
}

//--------------------------------------------------------------
/**
 * @brief   戦闘用パーティクルシステム・メイン関数(計算・描画処理などを実行)
 *
 * @param   none
 *
 * @retval	none
 */
//--------------------------------------------------------------
static void ParticleMain(void)
{
	int draw_num;
	GF_G3X_Reset();

	draw_num = Particle_DrawAll();	//パーティクル描画

	Particle_CalcAll();	//パーティクル計算

	GF_G3_RequestSwapBuffers(GX_SORTMODE_MANUAL, GX_BUFFERMODE_Z);
}



//--------------------------------------------------------------
/**
 * @brief	パーティクル開始
 *
 * @param	scene		シーンワーク
 * @param	inNo		エフェクトナンバー
 *
 * @retval	none
 *
 */
//--------------------------------------------------------------
static void StartParticle(SCENE4_WORK *scene, const int inNo)
{
	Particle_CameraTypeSet(scene->PtcPtr, GF_CAMERA_ORTHO);
	Particle_CreateEmitterCallback(scene->PtcPtr, SkillEffect[inNo][0],
									ParticleCallBack, NULL);
	Particle_CreateEmitterCallback(scene->PtcPtr, SkillEffect[inNo][1],
									ParticleCallBack, NULL);
	Particle_CreateEmitterCallback(scene->PtcPtr, SkillEffect[inNo][2],
									ParticleCallBack, NULL);
}

//--------------------------------------------------------------
/**
 * @brief	3Dセットアップ
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
static void SetUp3D(void)
{
	// ３Ｄ使用面の設定(表示＆プライオリティー)
    G2_SetBG0Priority(0);

	// 各種描画モードの設定(シェード＆アンチエイリアス＆半透明)
    G3X_SetShading( GX_SHADING_TOON );
	G3X_AntiAlias( TRUE );
	G3X_AlphaTest( FALSE, 0 );	// アルファテスト　　オフ
	G3X_AlphaBlend( TRUE );		// アルファブレンド　オン
	G3X_EdgeMarking( FALSE );
///	G3X_SetEdgeColorTable(gEdgeColor);
	G3X_SetFog( FALSE, GX_FOGBLEND_COLOR_ALPHA, GX_FOGSLOPE_0x8000, 0 );

	// クリアカラーの設定
    G3X_SetClearColor(GX_RGB(0,0,0),0,0x7fff,63,FALSE);	//color,alpha,depth,polygonID,fog

	// ビューポートの設定
    G3_ViewPort(0, 0, 255, 191);
}

//--------------------------------------------------------------
/**
 * @brief	上下画面切り替えＶタスク
 *
 * @param	scene		シーンワーク
 * @param	inMainDown	TRUEのとき、下画面がメイン
 *
 * @retval	none
 *
 */
//--------------------------------------------------------------
static void SwitchDisp(SCENE4_WORK *scene, const BOOL inMainDown)
{
	scene->MainDown = inMainDown;
	scene->SwitchTcb = VIntrTCB_Add( SwitchTcb, scene, 0 );
}

//--------------------------------------------------------------
/**
 * @brief	上下画面切り替えタスク
 *
 * @param	tcb			TCBポインタ
 * @param	work		ワークポインタ
 *
 * @retval	none
 *
 */
//--------------------------------------------------------------
static void SwitchTcb(TCB_PTR tcb, void* work)
{
	SCENE4_WORK *scene = (SCENE4_WORK *)work;

	if (scene->MainDown){
		//３Ｄ描画スイッチ(下画面がメイン)
		sys.disp3DSW = DISP_3D_TO_SUB;
		//上画面シルバー下画面ゴールド
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );//メインのシルバー面をオフ
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_ON );//メインのゴールド面をオン
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_ON );//サブのシルバー面をオン
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_OFF );//サブのゴールド面をオフ
	}else{
		sys.disp3DSW = DISP_3D_TO_MAIN;
		//上画面ゴールド下画面シルバー
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_ON );//メインのシルバー面をオン
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_OFF );//メインのゴールド面をオフ
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );//サブのシルバー面をオフ
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_ON );//サブのゴールド面をオン
	}
	GF_Disp_DispSelect();

	TCB_Delete(scene->SwitchTcb);
	//切り替え終了
	scene->SwitchTcb = NULL;
}